package com.powerbank.common.client;

import com.powerbank.common.result.Result;
import com.powerbank.common.result.PageResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.Map;

/**
 * 设备中心客户端降级实现
 */
@Slf4j
@Component
public class DeviceCenterClientFallback implements DeviceCenterClient {

    @Override
    public Result<Map<String, Object>> getDeviceInfo(String deviceCode) {
        log.warn("设备中心服务不可用，获取设备信息降级处理: deviceCode={}", deviceCode);
        return Result.error("设备服务暂时不可用，请稍后重试");
    }

    @Override
    public Result<Map<String, Object>> getDeviceStatus(String deviceCode) {
        log.warn("设备中心服务不可用，获取设备状态降级处理: deviceCode={}", deviceCode);
        return Result.error("设备服务暂时不可用，无法获取设备状态");
    }

    @Override
    public Result<List<Map<String, Object>>> getAvailableSlots(String deviceCode) {
        log.warn("设备中心服务不可用，获取可用槽位降级处理: deviceCode={}", deviceCode);
        return Result.success(Collections.emptyList()); // 降级时返回空列表
    }

    @Override
    public Result<Map<String, Object>> rentPowerbank(String deviceCode, Map<String, Object> rentRequest) {
        log.warn("设备中心服务不可用，租借充电宝降级处理: deviceCode={}", deviceCode);
        return Result.error("设备服务暂时不可用，无法租借充电宝");
    }

    @Override
    public Result<Map<String, Object>> returnPowerbank(String deviceCode, Map<String, Object> returnRequest) {
        log.warn("设备中心服务不可用，归还充电宝降级处理: deviceCode={}", deviceCode);
        return Result.error("设备服务暂时不可用，无法归还充电宝");
    }

    @Override
    public Result<List<Map<String, Object>>> getNearbyDevices(Double longitude, Double latitude, Integer radius) {
        log.warn("设备中心服务不可用，搜索附近设备降级处理: longitude={}, latitude={}", longitude, latitude);
        return Result.success(Collections.emptyList()); // 降级时返回空列表
    }

    @Override
    public Result<Void> deviceOnline(String deviceCode) {
        log.warn("设备中心服务不可用，设备上线降级处理: deviceCode={}", deviceCode);
        return Result.error("设备服务暂时不可用，设备上线失败");
    }

    @Override
    public Result<Void> deviceOffline(String deviceCode) {
        log.warn("设备中心服务不可用，设备下线降级处理: deviceCode={}", deviceCode);
        return Result.error("设备服务暂时不可用，设备下线失败");
    }

    @Override
    public Result<Void> updateDeviceStatus(String deviceCode, Map<String, Object> statusUpdate) {
        log.warn("设备中心服务不可用，更新设备状态降级处理: deviceCode={}", deviceCode);
        return Result.error("设备服务暂时不可用，状态更新失败");
    }

    @Override
    public Result<PageResult<Map<String, Object>>> getDeviceList(Integer page, Integer size, String keyword, Integer status) {
        log.warn("设备中心服务不可用，获取设备列表降级处理");
        PageResult<Map<String, Object>> emptyResult = new PageResult<>(Collections.emptyList(), 0L, page.longValue(), size.longValue());
        return Result.success(emptyResult);
    }

    @Override
    public Result<Void> sendDeviceCommand(String deviceCode, Map<String, Object> command) {
        log.warn("设备中心服务不可用，发送设备指令降级处理: deviceCode={}", deviceCode);
        return Result.error("设备服务暂时不可用，指令发送失败");
    }

    @Override
    public Result<Map<String, Object>> getDeviceMetrics(String deviceCode) {
        log.warn("设备中心服务不可用，获取设备运行数据降级处理: deviceCode={}", deviceCode);
        return Result.error("设备服务暂时不可用，无法获取运行数据");
    }
    
    @Override
    public Result<com.powerbank.common.dto.DeviceDTO> getDeviceById(Long deviceId) {
        log.warn("设备中心服务不可用，获取设备DTO降级处理: deviceId={}", deviceId);
        return Result.error("设备服务暂时不可用，无法获取设备信息");
    }

    @Override
    public Result<Void> lockDevice(Long deviceId, String orderNo) {
        log.warn("设备中心服务不可用，锁定设备降级处理: deviceId={}, orderNo={}", deviceId, orderNo);
        return Result.error("设备服务暂时不可用，无法锁定设备");
    }

    @Override
    public Result<Void> unlockDevice(Long deviceId, String orderNo) {
        log.warn("设备中心服务不可用，解锁设备降级处理: deviceId={}, orderNo={}", deviceId, orderNo);
        return Result.error("设备服务暂时不可用，无法解锁设备");
    }
}